home *** CD-ROM | disk | FTP | other *** search
/ Hyper Stacks 1994 May / Hyper Stacks (Pacific HiTech)(1994)[Mac].iso / Magazines / Windoid 1.5 / wind5.txt < prev    next >
Text File  |  1988-01-03  |  22KB  |  509 lines

  1.  
  2.  
  3. WINDOID Issue #5
  4.  
  5. A Publication for the Informed HyperCard User
  6. and the Newsletter for the  Apple HyperCard User Group
  7.  
  8. Editor -- David Leffler
  9.  
  10. In the fifth issue of WINDOID, Sioux Lacy gives you important information about
  11. HyperCard external commands (XCMD's) and external functions (XFCN's) .  These
  12. are the "Magic Hooks" that can written in "C", Pascal, or 68000 assembly
  13. language , and used to create exciting extensions to HyperCard functionality.
  14. Additionally, Phil Wyman has given us more HyperCard User Tips, Robin Shank
  15. explains some HyperCard features, James Redfern gives us an explanation of some
  16. HyperTalk concepts, and Paul Foraker teaches us how to Show hidden buttons and
  17. fields and how to Set scripts of objects on the fly.
  18.  
  19. I have had many requests for issues of WINDOID.  If you would like a copy, or
  20. copies, please send a Self Addressed Stamped Envelope (SASE) to the address
  21. listed on THE FORM for each issue.
  22. Thank you  for your continued interest in WINDOID.
  23. ==========
  24.  
  25. Editors Choice
  26. By David Leffler
  27.  
  28. Color, a XCMD written by Bill Tuttle is an incredible voyage into the world of
  29. color HyperCard!  This stack will only be truly appreciated by Macintosh II
  30. users with at least 16 colors but it is a delicious taste of what can be done
  31. with XCMDs.
  32. ==========
  33.  
  34. About XCMDs and XFCNs....
  35. by Sioux Lacy
  36. Tips & Techniques for Users of External Code Resources
  37.  
  38. Many of you may not be aware of yet another tool HyperCard has provided for the
  39. stack designer/user.  External commands or functions can be used to create an
  40. extension to HyperCard functionality.   Accessed much in the same manner that
  41. user-defined commands and functions are, "XCMD"s and "XFCN"s are code resources
  42. that can be attached to any stack.
  43.  
  44. Several external commands are included with the HyperCard product:
  45. "Flash" is an XCMD that will flash the screen (invert black and white, then
  46. invert back again).  Its attached to the HyperCard application so it can be
  47. accessed from any stack with the command "Flash", followed by the number of
  48. times you would like the screen to flash.
  49.  
  50. If you look in the Documents Representative stack, you will find another
  51. example of an external command:  "Getdocs".  It is called by the "Update"
  52. button's script.  A line in the "mouseUp" handler reads:
  53.  
  54.           getdocs line i of documents
  55.  
  56. This is a call to the "getdocs" command, passing it one argument which is a
  57. folder name from the Documents card in your Home stack.  "Getdocs" responds by
  58. creating the cards in the Documents stack.
  59.  
  60. Already some interesting external commands have appeared as shareware.  Some of
  61. them provide the user with a button that will attach the external code to your
  62. stack, but if you discover one that hasn't, you can use the following method to
  63. do so:
  64.  
  65. To attach an existing external command to one of your stacks, you will need to
  66. use a resource mover, like ResEdit, to copy it from its current stack, and
  67. paste it into your stack.  In ResEdit, this procedure works as follows:
  68. 1) Launch ResEdit
  69. 2) Find the stack with the external command or function that you want to copy,
  70. and open that stack
  71. 3) You will see a resource type of XCMD (or XFCN)
  72. 4) Select and copy the resource
  73. 5) Then find and open your stack
  74. 6) It will probably ask you if you want to open a "resource fork" for your
  75. stack (unless it already has one).
  76. 7) Click "Ok", ResEdit will open a window into which you can paste the
  77. resource.
  78.  
  79. About XCMDs....
  80. Tips & Techniques for Writers of External Code Resources
  81.  
  82. For you Pascal, C, or 68000 assembly language programmers who want to write
  83. your own external commands, here are a couple hints:
  84.  
  85. 1  Most importantly, do get the "HyperCard Developer's Toolkit" package from
  86. APDA, Apple Programmer's & Developer's Association is located at:
  87.    290 SW 43rd Street
  88.    Renton, WA 98055
  89. This package includes a disk, called "Magic Hooks", with sample source files in
  90. Pascal and C, and preliminary documentation.
  91.  
  92. 2  Don't declare any global or static variables.  Externals cannot share
  93. HyperCard's global data space.  You can allocate space on the heap with
  94. "NewHandle" or "NewPtr" calls, but be sure to dispose of that space before you
  95. return to HyperCard.
  96.  
  97. 3  Some of the callback glue routines also return handles to the caller.
  98. (specifically, PasToZero, EvalExpr, GetGlobal, GetFieldByName, GetFieldByNum,
  99. and GetFieldByID)  In these cases, HyperCard has allocated the space associated
  100. with these handles, and your code is responsible for deallocating it once
  101. you've examined its contents.
  102.  
  103. 4  The rule about disposing handles and pointers that your code allocates has
  104. one exception:  if you allocate space in order to return a string to HyperCard
  105. in the "returnValue" element of the XCmd parameter block.  HyperCard has not
  106. pre-allocated any heapspace for that handle.  You must do the allocation in
  107. your code, then copy your return message into that allocated space.  HyperCard
  108. will dispose of the space for you.
  109.  
  110. An example that combines usage of a callback routine, and assignment to a
  111. returnValue follows.  Note that in this case, you do not deallocate the handle.
  112. This example uses the "PasToZero" callback routine to copy a string and
  113. zero-terminate it for return to HyperCard.
  114.  
  115. paramPtr^.returnValue :=  PasToZero('An error has occurred.');
  116.  
  117. 5  For testing externals, one useful technique is to call your code repeatedly
  118. from Hyper-Card, and "put the heapspace" in between the calls.  If you see a
  119. rapidly diminishing heap, you might suspect that your external is allocating
  120. space and forgetting to dispose of it.
  121.  
  122. 6  An error in the "Magic Hooks" documentation: the callback routines,
  123. "ExtToStr" and "StrToExt" convert floating point numbers to strings and vise
  124. versa -- not to convert extended long integers.  Oops, sorry about the error.
  125.  
  126. 7  HyperCard stores strings as zero-terminated arrays of any length.  This is
  127. consistent with the way 'C' handles strings, but not Pascal.  So, for example,
  128. when a Pascal code resource receives parameters, it will need to convert the
  129. strings to Pascal strings (beginning with a length byte, and no
  130. zero-terminator).  Read the documentation for the callback glue routines
  131. carefully.  Some of those routines return zero-terminated strings, and others
  132. return Pascal strings.  Your code will need to convert if appropriate.
  133.  
  134. Also, remember that a Pascal string is limited in length to 255 characters.
  135. So, for example, if you have a zero-terminated string that is longer than that,
  136. and you call ZeroToPas to convert it for you, HyperCard will truncate your
  137. string to 255 characters.
  138.  
  139. 8  If you're writing external code in MPW 'C', there are some additional
  140. constraints that you need to be aware of regarding string literals.  In an
  141. environment that has global and static data initialization, you can copy a
  142. string to the space referenced by a handle in this manner:
  143.  
  144. myHndl = NewHandle( STRINGSIZE );
  145. strcpy( *myHndl, "Hello world" );     /* probably should lock this handle */
  146.                                     /* and unlock it after the strcpy call */
  147.  
  148. In an MPW C (see Lightspeed note below) external code resource, you cannot use
  149. a string literal.  Instead you must create an STR# resource that contains your
  150. strings (use ResEdit to do this), and then retrieve them with a call to
  151. GetIndString:
  152.  
  153. char myString[ STRINGSIZE ];           /* make an array large enough */
  154.  
  155. GetIndString( myString, RESOURCE_ID,  STRING_NUM );
  156.  
  157. 9  It is not necessary to initialize the various Tool Managers in your external
  158. code.  HyperCard has already done this, and in some cases, such as the
  159. GrafPort, reinitialization can be hazardous.
  160.  
  161. Note:  LightSpeed C will allow the string literal to be passed as an argument.
  162. ==========
  163.  
  164. HyperCard User Tips
  165. by Phil Wyman
  166.  
  167. 1.  There is a form of the Repeat command which works with "down to". "Down to"
  168. is two words in this syntax. This form of the repeat command will iterate your
  169. variable downward each step through the loop.
  170.  
  171.    repeat with x = 100 down to 1
  172.      put x into field 1
  173.      go next card
  174.    end repeat
  175.  
  176. An example of a useful application of the "repeat down to" command is if you're
  177. deleting all the buttons or deleting all the fields of a card or background.
  178. For instance,
  179.  
  180.    put the number of buttons of this card into var
  181.    repeat with x = var down to 1
  182.      choose button tool
  183.      click at the loc of button x
  184.      doMenu "Cut Button"
  185.    end repeat
  186.  
  187. If you had done this with "x = 1 to var" instead of "x = var down to 1" then
  188. soon you would be clicking at a button that didn't exist.
  189.  
  190. 2.  There's a nice debugging feature in the HomeStack Script. The handler is
  191. called searchscript, and its two parameters are first the string you are
  192. searching for, and second the stack that you are going to be searching for that
  193. string.  What if, for example, you had hundreds of cards with scripts, and you
  194. found you misspelled a word in one script. You could then search all your
  195. scripts to find which ones had the same misspelling error. You would say in the
  196. message box:
  197.  
  198.    searchscript "mispelled word","stackname"
  199.  
  200. 3.  You do not have to have your cursor at the end of your message in the
  201. message window in order to execute your message.  In the message window, you
  202. may be typing along on the fifth word and found that you've made a typing error
  203. on the first word.  You click on the first word and correct your error.  Now
  204. the cursor is in the first word. At this point you can still hit the return or
  205. enter keys to execute the message window, even though your cursor is not at the
  206. end of the message.
  207.  
  208. 4.  An easy way to copy a current background in your stack into a new
  209. background in the same stack is:
  210.  
  211. Copy card, go to a temporary stack, paste Card. Immediately copy card, go to
  212. original stack and paste the card.  This should create a new background in your
  213. stack that is exactly like your old one.
  214.  
  215. If you need to copy the foreground of a card to the current background, try the
  216. free utility stack "Foregnd to Bkgnd".
  217. ==========
  218.  
  219. "It's a Feature"
  220. Explanations of some HyperCard features
  221. by Robin Shank
  222.  
  223. Drawing through scripts:
  224. Because  the Polygon tool is controlled differently than the other drawing
  225. tools, the Drag From command won't work in this tool.  If you need to plot
  226. irregular shapes, use the Curve tool, or the Line tool instead.  The Lasso
  227. tool depends on an enclosing movement to select something, but a script will
  228. only drag in a straight line.
  229.  
  230. In many cases when you draw through a script, you will want to set the
  231. dragSpeed down to around 500.  With the dragSpeed at the default setting, the
  232. Spray tool will only show the starting and ending points, because the spray
  233. cycle is slower than the movement on the screen.  Also, with Draw Multiple on,
  234. you won't see any multiples unless the dragSpeed is slowed down.
  235.  
  236. Printing Notes:
  237. Background fields that are overlapped by another object or card picture will
  238. print at 72 dpi on the LaserWriter.  A piece of card paint whose rect overlaps
  239. a background field will cause that background field to print at 72 dpi.  (The
  240. rect can be shown by the rectangle formed by the marching ants when drawn by
  241. the selection rectangle.)  One exception:  if a transparent button that
  242. does not show a name or icon covers a background field, that field will still
  243. print at high resolution.
  244.  
  245. After printing a stack or report,  the format is saved as the default.
  246. However, when printing cards through a script using Open printing with dialog,
  247. the dialog will show the default format determined by the last Print Stack, but
  248. changes to the printing format are not saved and affect only that one print
  249. job.
  250.  
  251. MultiFinder...
  252. 750K is the absolute minimum memory configuration recommended to run HyperCard
  253. under MultiFinder.  If you run HC under MultiFinder on a 1 Mb machine, you will
  254. be limited to Typing UserLevel and processes that need more memory (such as
  255. pasting graphics or printing) will, at the least complain, and at the worst,
  256. exit grumpily back to the Finder.  (who said crash??)
  257.  
  258. When printing under MultiFinder with Background Printing ON, Print stack sends
  259. copious amounts of data to the LaserWriter in a very short period of time.  If
  260. a spooler of any kind is catching that before sending it to the printer, it is
  261. likely to fill up very quickly.  A MultiFinder Spool folder for a 10 card, 20K
  262. stack could easily be over 1 Mb.  (500K + per card is being sent to the
  263. LaserWriter)
  264. ==========
  265.  
  266. Some Things Useful
  267. by James Redfern
  268.  
  269. This is a short explanation of some concepts that are useful in using
  270. HyperTalk:
  271.  
  272. * A container is what you put your information into.  Containers are: "it",
  273. "selection", the message box, a field, or a variable.  Containers can be
  274. thought of as open or closed.  An open container displays information on the
  275. screen; the contents of a closed container can not be viewed.  Variables and
  276. "it" are closed containers.  The number of characters in an open container must
  277. be less than 32K, probably less than 30K to be safe, and less than 5K if a
  278. scrolling field is to respond quickly.  The number of characters in a closed
  279. container are limited by available memory.  (An exception is the use of the
  280. prepositions "before" or "after" with a closed container, which limits the
  281. number of characters to 64K.)
  282.  
  283. * Information is represented as a string of characters.  Strings can sometimes
  284. be further interpreted as numbers or the logical values: "true" and "false".  A
  285. number can be further interpreted as an integer or unsigned integer.
  286.  
  287. * When HyperCard performs an operation that requires numbers as operators, such
  288. as addition, it will try to interpret, i.e. convert, the strings as numbers.
  289. If the resulting number is put into a closed container, the container will
  290. retain the full precision of the internal representation.  If the resulting
  291. number is put into an open container, the number must be represented, i.e.
  292. converted, as a string.  HyperTalk uses the current value of the numberFormat
  293. property to format the string representation.
  294.  
  295. * When HyperCard performs an operation that requires strings as operators, such
  296. as concatenation, it will first represent any numbers as strings using
  297. numberFormat.  The resulting string will remain a string even if it is put into
  298. a closed container.
  299.  
  300. * Constants, such as "pi" or "zero", represent strings of digits, and are not
  301. interpreted as numbers unless forced to by an operation.  Therefore, "put pi"
  302. results in "3.141592653..." but "put pi + 0" results in "3.141593" (the "+"
  303. forced "pi" to be converted to a number, which had to be converted back to a
  304. string since the message box is an open container, so numberFormat was used to
  305. round to six fractional decimal places).
  306.  
  307. * Comparison is an operation that will try to interpret strings as numbers.
  308. Therefore, "3" > "20" is false, but "*3" > "*20" is tru:  If the goal is a
  309. string comparison and the values could be interpreted as numbers, then a
  310. non-numeric character must be concatenated to both values, such as 'if "*" &
  311. variable1 > "*" & variable2 then...' to prevent interpretation as a number.
  312. Remember that equality comparisons, "=" and "<>", use only primary ordering of
  313. characters, so case and diacriticals are ignored.  Magnitude comparisons use
  314. both primary and secondary ordering.
  315. ==========
  316.  
  317. Showing and Setting
  318. by Paul Foraker
  319.  
  320. --Please remember that a % is an Option-Return in ASCII TEXT
  321. --format.   Editor
  322.  
  323. Lost and Found
  324.  
  325. In the process of designing your own stacks, once in a while you're likely to
  326. forget things. If youUve ever hidden a field or a button from yourself, you
  327. might appreciate this little script.
  328.  
  329. -- make a new button anywhere on your card
  330. -- (youUll delete it later) & put this script in it:
  331. on mouseUp
  332.   repeat with i = 1 to the number of fields
  333.     -- or bkgnd buttons, or card fields, or buttons
  334.   show field i
  335.     -- or bkgnd button i, etc.
  336.   end repeat
  337. end mouseUp
  338.  
  339. Now, when you click on this temporary button, all your hidden fields or buttons
  340. will come into view.
  341.  
  342. Setting Scripts of Objects on the Fly
  343.  
  344. There are times when you want a HyperTalk script to make new objects (like
  345. buttons or fields) and put scripts into them. The command for getting scripts
  346. into objects is set script of <object> to <source>.  This command can be used
  347. in a number of different ways. Let's look at some examples (for the sake of
  348. simplicity, IUve assumed that weUre using a simple button mouseUp handler to
  349. set the script of a button named, target.):
  350.  
  351. -- getting the new script directly from the executing handler
  352. -- (remember not to use Option-Return inside a quoted string)
  353. on mouseUp
  354.   set script of button "target" to "on mouseUp" & %
  355.   return & "go next card" & return & "end mouseUp" & return
  356. end mouseUp
  357.  
  358. --getting the new script from a field
  359. on mouseUp
  360.   set script of button "target" to field 1
  361. end mouseUp
  362.  
  363. --getting the new script from another object
  364. on mouseUp
  365.   set script of button "target" to script of button 2
  366. end mouseUp
  367.  
  368. --modifying an existing script
  369. --let's say we think the old script was simply (on mouseUp) "go next
  370. --card", but we're not sure; it might already have a visual effect,
  371. --and we want to add a visual effect:
  372. on mouseUp
  373.     --first check for a visual effect & get out if there is one
  374.   if script of button "target" contains "visual" then exit mouseUp
  375.     -- if not, then modify the script
  376.   put script of button "target" into temp
  377.   put return & "visual effect wipe left" after line 1 of temp
  378.   set script of button "target" to temp
  379. end mouseUp
  380.  
  381. [Thanks to Linda Donovan for the suggestions.]
  382. ==========
  383.  
  384. Wanted:
  385. StackWare Reviews and Recommendations for Whole Earth Catalog
  386. by Tim Oren
  387.  
  388.  
  389. The Whole Earth Catalog rides again!  Apple and the Point Foundation have
  390. collaborated on a HyperCard version of the Whole Earth Catalog which was shown
  391. at MacWorld and gained significant media  attention.  Now we are beginning
  392. phase two of this project, which will incorporate reviews and recommendations
  393. of StackWare and HyperCard tools and accessories.  Because of the rapid
  394. proliferation of stacks, we must rely on you, the users, to bring significant
  395. developments to our attention.  Particularly, we are looking for
  396. recommendations or short reviews of:
  397.  
  398. % HyperCard Tools:  These can take the form of stacks incorporating significant
  399. extensions to HyperCard, in the form of scripts or XCMDs.  Examples might be
  400. online service frontends, techniques for scrolling links, resource moving and
  401. conversion utilities, generalized text import or export techniques.  Non-stack
  402. tools might include: useful DAs or companion programs to assist in building
  403. stacks, data import devices (scanners, digitizers, ...) which help convert
  404. material into stack format, and books, magazines, and teaching aids which help
  405. in learning or using HyperCard.
  406.  
  407. % Stacks with significant content:  HyperCard was designed as a information
  408. vehicle for the non-programmer.  Many significant stacks may not show a lot of
  409. programming "flash" but will contain vital data.  For example, star catalogs,
  410. pharmaceutical directories, industry guides, and so on.  Let us know what's out
  411. there.
  412.  
  413. % Stackware as a new media artform:  We are beginning to see stacks that use
  414. HyperCard as a fusion artform, collaging graphics, sound, stored dynamics, and
  415. browsing into an interactive experience.  We are interested in stacks leading
  416. in this direction of "information as art".
  417.  
  418. % Things we've missed:  This area is moving so fast that we have undoubtedly
  419. overlooked major categories and themes.  Please bring them to our attention.
  420.  
  421. Keep in mind that we are in the early days of stackware development.  The items
  422. we include should have "staying power" - they should be of such a quality that
  423. they will still be of interest in a year, let's say.  We encourage electronic
  424. submission of reviews - please include the stack or tool itself if it is
  425. freeware or shareware, otherwise please give the full reference to the
  426. publisher so that we may verify pricing and availability information.
  427.  
  428. All submissions will be considered, though not all will be used.  Submissions
  429. used will earn you a byline in the first-ever electronic Whole Earth Catalog
  430. and the knowledge that you have done a Good Deed for the HyperCard user
  431. community.  Submissions may also be considered for inclusion in the Whole Earth
  432. Review magazine, which carries a monetary reward as well.
  433.  
  434. Here are our addresses:
  435.  
  436. Uucp:  ucbvax!well!hank
  437. Compuserve:  leave message in WEC sig
  438. AppleLink(tm):  OREN1
  439. SnailMail:
  440.   Whole Earth Stackware Toolbox
  441.   27 Gate Five Rd.
  442.   Sausalito, CA  94965
  443. ==========
  444.  
  445. We hope you have enjoyed reading WINDOID and have found it to be interesting
  446. and informative. We care enough to take the time to give you the most
  447. up-to-date information about HyperCard, and we would like to make a request for
  448. a little of your time. There is a form that follows this editorial; please fill
  449. it out if you will. We are very interested in hearing from you. What sort of
  450. stacks are you using, what kind of stacks are you creating, and what are your
  451. joys and frustrations in using HyperCard.
  452.  
  453. You have the unique opportunity to communicate directly with Bill, Dan, and the
  454. entire HyperCard development team. We really want to know what you would like
  455. to see in HyperCard and are more than willing to give you what you want. What
  456. we need to make this happen is your input. Let us know what you think. We can
  457. address it in WINDOID or perhaps the next revision of HyperCard. You can make a
  458. difference in the world by communicating with us. DonUt pass up the
  459. opportunity!
  460. ==========
  461.  
  462. If you have a bug, suggestion, comment, or just want to know
  463. the best way to do something in HyperCard, you can fill out the form and send
  464. it to:
  465.  
  466. AHUG c/o David Leffler
  467. Apple Computer, Inc.
  468. MS/27-AQ
  469. 20525 Mariani Ave.
  470. Cupertino, CA 95014
  471.  
  472. Or copy the format and
  473. Apple-Link(TM) it to:
  474. HYPERBUG$
  475.  
  476. TELL HYPERCARD
  477. You can use this form to notify the HyperCard team of problems, bugs, and
  478. enhancement requests.
  479.  
  480. THE FORM:
  481.  
  482. Please use the following form to make a difference in the world:
  483.  
  484. Date:
  485. Name:
  486. Address:
  487. Phone #:
  488. Versions of:
  489.  a.  HyperCard:
  490.  b.  Associated software:
  491.  c.  System Software:
  492.      1. System
  493.      2. Finder
  494.      3. ImageWriter file
  495.      4. LaserWriter file
  496.      5. Any others
  497. Type of Macintosh:
  498. Peripherals:
  499. Description of problem, suggestions or comments:
  500.  
  501.  
  502. Please fill this form out as completely as possible and send it to us.  You
  503. will be glad you did!
  504.  
  505.  
  506.  
  507.  
  508. [ Uploaded to CIS by Raines Cohen of BMUG's HyperCard SIG! ]
  509.